﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Windows.Forms;
using ProjectHandicap;


namespace HandicapsApp
{
    public partial class loginScreen : Form
    {
 
        public loginScreen()
        {

            InitializeComponent();
        }


        /// <summary>
        /// le .Focus() ne s'applique pas en  ASP.NET
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btLogin_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(tbUser.Text))
            {
                //Focus la boite avant d'afficher le message
                tbUser.Focus();
                MessageBox.Show("Entrer nom d'utilisateur", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                //Focus encore une fois, parfois les utilisateurs double clic sur les messages box et choissisent un autre control par accident
                tbUser.Focus();
                return;
            }
            else if (string.IsNullOrEmpty(tbPass.Text))
            {
                tbPass.Focus();
                MessageBox.Show("Entrer mot de passe", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                tbPass.Focus();
                return;
            }

            //Le login et le pass sont entrés, on vérif si ils peuvent s'authentifier
            using (DataTable dt = CryptingPass.cryptingPass.LookupUser(tbUser.Text))
            {
                if (dt.Rows.Count == 0)
                {
                    tbUser.Focus();
                    MessageBox.Show("Nom d'Utilisateur invalide.", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Error);
                    tbUser.Focus();
                    return;
                }
                else
                {
                    //Il faut toujours comparer le résultat d'un string crypté ou un hash, jamais une valeur décrypté
                    //En faisant ainsi on appel jamais la fonction Decrypt() ce qui rend l'appli plus difficile à décompiler
                    //ou toute tentative de reverse engineering.
                    //Il n'est pas recommendé de livrer des assembly contenant des methodes Decrypt().
                     

                    string dbPassword = Convert.ToString(dt.Rows[0]["Password"]); //on convertie en string le pass encrypté de la base
                    string appPassword = CryptingPass.cryptingPass.Encrypt(tbPass.Text); //on encrypte le pass entré par l'user dans la txtbox
                    if (string.Compare(dbPassword, appPassword) == 0) //et on compare les 2 :)
                    {
                        //Houra on est connecté !
                        new newInter().Show();
                        this.Hide();
                    }
                    else
                    {
                        //Si le pass est faux on affiche une message box. On peut aussi indiquer le meme message d'erreur,
                        //ainsi "l'utilisateur" ne sait pas quel champs est faux. A voir...
                        tbPass.Focus();
                        MessageBox.Show("Mot de passe invalide 2", this.Text, MessageBoxButtons.OK, MessageBoxIcon.Information);
                        tbPass.Focus();
                        return;
                    }
                }
            }
        }

        private void btQuit_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }
    }
}